import os
import pandas as pd
import numpy as np
from pptx import Presentation
from pptx.util import Inches
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docx.shared import Cm

class Tutor(object):
    def __init__(self,name='未命名',bad_names={}):
        """初始化前需要确保input文件夹内已经有[学员档案-203936.xlsx，作业批改详情.xlsx]

        Parameters
        ----------
        name : str, optional
            辅导老师姓名, by default '未命名'
        """        
        self.name=name
        self.df=None
        self.df_single=None
        self.list_student=[]
        self.li_will_do_something=[]
        self.times=0
        try:
            path_input=os.getcwd()+os.sep+'input'+os.sep#pytool/
            filenames = os.listdir(path_input)
            for filename in filenames:
                if filename[:4]=='学员档案':
                    self.df=pd.read_excel(path_input+filename)
                if filename[:6]=='作业批改详情':
                    self.df_single=pd.read_excel(path_input+filename)
            self.list_student=self.df['姓名'].tolist()

            m=self.df['到课汇总'].str.split('/',expand=True).astype('int')
            self.df['live']=m[0]
            self.df['liveSum']=m[1]
            n=self.df['作业汇总'].str.split('/',expand=True).astype('int')
            self.df['work']=n[0]
            self.df['workSum']=n[1]
        except TypeError:
            print('已知错误：确保input文件夹内已经有[学员档案-203936.xlsx，作业批改详情.xlsx]')
        except Exception as e:
            print('未知错误：%s'%e)
        #db
        db=pd.DataFrame()
        for i in (os.listdir('./input/作业批改All')):
            if '作业批改' not in i:
                continue
            self.times+=1
            db=pd.concat([db,pd.read_excel(r'./input/作业批改All/'+i)])
        db=db.sort_values(by='节次id')
        db=db.replace('未提交',1000)
        db=db.replace('待批改',1000)
        db=db.fillna(0)
        qs=len(db.columns)-11
        for i in range(qs):
            i=i+1
            db[['第'+str(i)+'题']]=db[['第'+str(i)+'题']].astype('int')
        self.db=db
        # bad_names
        for i in bad_names:
            for j in range(len(self.list_student)):
                self.list_student[j]=self.list_student[j].replace(i,bad_names[i])
            self.df=self.df.replace(i,bad_names[i])
            self.df_single=self.df_single.replace(i,bad_names[i])
            self.db=self.db.replace(i,bad_names[i])
    def gen_excel_base_old(self):
        df2 = pd.read_excel(r'/Users/tylor/pyTool/学员-课程跟催-with学员uid.xlsx')
        df2.drop(df2.columns[0:2], axis=1, inplace=True)
        df2=df2.drop_duplicates()
        df2.dropna(axis=0,how='all',inplace=True)
        df2.columns =np.array(df2[0:1]).tolist()
        df1=pd.read_excel(self.excel_all)
        df2.to_excel('output'+os.sep+'temp.xlsx',header=False,index=False)
        df2=pd.read_excel(r'/Users/tylor/pyTool/output/temp.xlsx')
        df2=df2[['学员姓名','本节直播','本节回放']]
        df_all=pd.merge(df1,df2,how='left',left_on='姓名',right_on='学员姓名')
        self.df=df_all
        df_all.to_excel('学员数据.xlsx')    

    def feedback_old(time_live,time_playback,grade,name):
        if time_live > 100 and time_playback>100:
            str1 = '一共听了' + str(time_live) + '分钟的直播课程，而且下课之后又听了回放，继续保持~'
        elif time_live>100 and time_playback==0:
            str1 = '一共听了' + str(time_live) + '分钟的直播课程，继续保持~'
        elif time_live>0 and time_playback>0:
            str1 = '早上可能来晚了，只听了' + str(time_live) + '分钟的直播课程，不过目前已经看了回放，下次记得按时上课~'
        elif time_live>0 and time_playback==0:
            str1 = '早上可能来晚了，只听了' + str(time_live) + '分钟的直播课程，剩下的可以看一下回放~'
        elif time_live==0 and time_playback>0:
            str1 = '孩子由于时间原因没有参加直播，不过目前已经看了回放，如果有不懂的可以问我~' 
        else:
            str1 = '孩子由于时间原因没有参加今天的直播课，' 
        if grade>100:
            str2 = '然后作业还没有提交，尽量在今天完成'
        elif grade<60:
            str2 = '然后作业已经改完了，但是没有及格，图像比较重要，如果有知识盲区一定要解决'
        else :
            str2 = '然后作业已经改完了，掌握的很不错，得了' + str(grade) + '分，加油~'
        str0 = '下午好，和您反馈一下' + str(name) + '的物理学习情况：昨天学习的是比较重要的图像，'
        str3 = '^_^'
        str_all =str0 + str1 + str2 + str3
        return str_all

    def feedback(self,grade,subject,main_teacher,kaoDian,fenXi,p1=True):
        """遍历学生列表，反馈，输出目录为output/feedback

        Parameters
        ----------
        grade : string
            所带班级年级

        subject : string
            所带科目

        main_teacher : string
            主讲老师姓名

        p1 : bool, optional
            可设为False，则课堂表现个性化反馈为空, by default True
        """        
        for stu in self.list_student:
            this_df=self.df[self.df['姓名']==stu]
            tmp=self.df_single[self.df_single['学员姓名']==stu]['第1题']=='未提交'
            if this_df['live'].values==0:
                continue
            document = Document()

            document.styles['Normal'].font.name = u'STHeiti'
            document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'STHeiti')
            #document.add_picture('./input/background.png',)
            #添加标题，并设置级别，范围：0 至 9，默认为1
            document.add_heading(stu+'同学阶段性测试学情分析报告', 0)
            document.add_paragraph('腾讯企鹅辅导-2020秋·%s%s%s老师班'%(grade,subject,main_teacher), style='Intense Quote')
            #添加段落，文本可以包含制表符（\t）、换行符（\n）或回车符（\r）等
            p1=document.add_paragraph('亲爱的%s同学及家长：\n        您好！\n        在%s老师和%s老师的教学与辅导下，我们已经一起完成了%s%s秋季班五次课程的学习，相信%s同学在这一个多月的学习生活中，不仅收获了专业的学科知识和锻炼了逻辑思维能力，同时也培养了良好的学习习惯。\n        为了能让同学和家长更好地了解目前的学习情况，以便对%s乃至高中的%s学习做好长远规划，老师针对学生的课堂表现、课后作业完成情况以及本次阶段性测试结果，为%s同学制作了详细的个性化学情分析报告，请同学和家长仔细阅读。'%(stu,main_teacher,self.name,grade,subject,stu,grade,subject,stu))
            p2=document.add_paragraph('%s同学\n主讲老师：%s老师\n辅导老师：%s老师'%(stu,main_teacher,self.name))
            #在段落后面追加文本，并可设置样式
            # p.add_run('Ps：'+grade+'所学知识点占高考知识点60%，请务必重视！').bold = True
            #
            document.add_heading('一. 2020秋·%s%s课程主要内容'%(grade,subject), level=1)

            p3=document.add_paragraph()
            document.add_picture('./input/课表.png',width=Inches(6))
            document.add_heading('二. 课程表现', level=1)
            this_db=self.db[self.db['学员姓名']==stu]
            tmp1=[]
            for i in range(self.times):
                tmp1.append('第%s节课'%'一 二 三 四 五 六 七 八 九 十 十一 十二 十三 十四 十五 十六'.split(' ')[i])
            #df.loc[:,'节次']=['第一节课','第二节课','第三节课','第四节课']
            this_db.loc[:,'节次']=tmp1
            this_db=this_db.iloc[:,11:]
            this_db['作业分数']=this_db.sum(axis=1)
            this_db['作业完成情况']='完成'
            this_db['作业完成情况'][this_db['作业分数']>3000]='未完成'
            
            this_db=this_db[['节次','作业完成情况','作业分数']]

            work_done=len(this_db[this_db['作业分数']<=100])
            work_full=len(this_db[this_db['作业分数']==100])
            this_db['作业分数'][this_db['作业分数']>1000]=' '
            t=0
            if work_done!=0:
                t=work_full/work_done
            document.add_paragraph('直播到课率：%s\n作业总完成率：%s\n作业总满分率：%s'%('%.2f%%' %(this_df['live'].values/this_df['liveSum'].values*100),'%.2f%%' % (work_done/this_df['workSum'].values * 100),'%.2f%%' %(t*100)))

            #document.add_heading('【作业成绩数据报告】', level=1)
            def test(df):
                row=df.shape[0]
                col=df.shape[1]
                table = document.add_table(rows=1, cols=col, style='Light Shading Accent 2')
                for i in range(col):
                    table.rows[0].cells[i].text=df.columns[i]
                for r in range(row):
                    row_cells = table.add_row().cells
                    for c in range(col):
                        row_cells[c].text = str(df.iloc[r][c])
            test(this_db)
            #document.add_heading('【学习总体表现】', level=1)
            text='        '
            if this_df['live'].values==this_df['liveSum'].values:
                if this_df['work'].values==this_df['workSum'].values:
                    text+='%s同学每次直播课都有参加，听讲认真，上课积极参与互动，并且真正在学习中思考，特别是上课答题参与没有畏难情绪。而且作业完成情况非常不错，正确率还可以，把学习内容落实到了具体做题上，看得出来课后有对课堂内容的落实消化，有错误会及时订正。'%stu
                else:
                    text+='%s同学每次直播课都有参加，听讲认真，上课积极参与互动，并且真正在学习中思考，特别是上课答题参与没有畏难情绪。但是孩子的作业还没有全部在APP内提交，麻烦您提醒一下孩子吧，这样我也方便了解%s对知识点的掌握程度'%(stu,stu)
            else :
                if this_df['work'].values==this_df['workSum'].values:
                    text+='%s同学由于时间原因没有参加所有的直播课，有问题会及时找我答疑或者看回放。作业完成情况非常不错，正确率还可以，把学习内容落实到了具体做题上，看得出来课后有对课堂内容的落实消化，有错误会及时订正。'%stu
                else:
                    text+='%s同学由于时间原因没有参加所有的直播课，有空您提醒一下孩子看回放吧。孩子的作业还没有全部在APP内提交，麻烦您提醒一下孩子吧，这样我也方便了解%s对知识点的掌握程度'%(stu,stu)
            if p1==False:
                text=' '
            document.add_paragraph(text)
            #
            if tmp.iloc[0]:
                document.save('./output/feedback/学情报告-%s%s未完成.docx'%(stu,this_df['live'].values))
                continue
            document.add_heading('三. 阶段性测试完成情况', level=1)
            #一
            sp1=document.add_paragraph('（1） 阶段性测试成绩统计')
            exam=self.df_single[self.df_single['学员姓名']==stu].drop(['学员昵称','所属班级','调班调课','调班调课','批改老师姓名','课程id','节次id','节次上课时间','学生uin','批改老师id','作业提交时间'],axis=1)
            exam=exam.replace('未提交',1000)
            for i in exam.columns[1:11]:
                exam[i]=exam[i].astype('int')
            exam['总分']=exam.iloc[:,1:11].sum(axis=1)
            test(exam)
            sp2=document.add_paragraph('（2） 逐题详析')
            kd=kaoDian
            fx=fenXi
            for i in range(10):
                i=i+1
                t='正确'
                if exam.iloc[0][i]!=10:
                    t='错误'
                pt=document.add_paragraph('题%s：%s\n考点：%s'%(str(i),t,kd[i-1]))
                if t=='错误':
                    pt.add_run('\n错题分析：'+str(fx[i-1]))
            sp3=document.add_paragraph('（3） 阶段性测试分析')
            score=int(exam['总分'])
            txt_socre=''
            if score==100:
                txt_socre='满分的成绩是对认真和努力的最好肯定，通过测试结果可以看到%s同学对待物理学科的学习的高度热情，对基础知识掌握牢固，能够理解物理模型，希望你能继续保持优秀的学习习惯，用一个又一个满分创造自己更美好的明天！'%stu
            elif score>80:
                txt_socre='%s同学学习物理的成果，已经通过测试结果有所展示了，对基础知识的掌握和重难点的逻辑分析，老师们都看到了你的努力，相信在将错题与知识点一一对应再次巩固后，会在下次测试中取得更优异的成绩！'%stu
            elif score>60:
                txt_socre='%s同学顺利通过了本次测试是值得表扬和肯定的，测试结果只反映了我们阶段性学习的知识掌握度，希望你能在分析错题的过程中多和辅导老师进行探讨，真正理解物理知识的逻辑与模型，在下次的测试中取得优异的成绩，加油！'%stu
            else:
                txt_socre='%s同学完成了本次测试是值得鼓励和肯定的，通过测试结果可以发现自己急需加强学习的地方，请再次观看课程回放，抓紧时间和辅导老师讨论错题，弄清楚自己不会的原因，老师们愿意和你一起努力，希望你在下次测试中取得飞跃的进步！'%stu
            document.add_paragraph('        '+txt_socre)
            document.add_paragraph('        以上是%s同学本次阶段性测试的总体情况，希望家长监督同学认真落实好老师的每一项要求，%s上学期的时间已经过去三分之一了，目之所及的差距并非是不可逆的。所以请同学严格要求自己，将课上的内容仔细思考、吃透，这样一定会对%s学科有更深刻的理解，对自己的%s学习也会更有自信！'%(stu,grade,subject,subject))
            # try:
            #     document.add_picture('./output/%s.jpeg'%stu,width=Inches(4))
            #     p = document.add_paragraph('        以上是孩子这次期中测试的总体情况，希望家长监督同学们认真落实好老师的每一项要求，%s上学期的时间已经过去三分之一了，但所目及的差距并非是不可逆的。%s是高中承上启下最重要的一年，所以请大家不要放松要求，将课上的内容仔细思考，吃透。相信大家在%s学科会有一个新的开始。对自己的%s学习也会更有自信！'%(grade,grade,subject,subject))
            # except Exception as e:
            #     p = document.add_paragraph('        孩子这次的期中测试还没有提交，希望家长监督同学们认真落实好老师的每一项要求，%s上学期的时间已经过去三分之一了，但所目及的差距并非是不可逆的。%s是高中承上启下最重要的一年，所以请大家不要放松要求，将课上的内容仔细思考，吃透。相信大家在%s学科会有一个新的开始。对自己的%s学习也会更有自信！'%(grade,grade,subject,subject))
            #     print(e)
            
            #document.add_heading('【重要】另附课堂正常流程，希望家长认真阅读，明晰配合事项：', level=1)


            # for i in document.sections:
            #     i.page_width=Cm(29.7)
            #     i.page_height=Cm(21)
            document.save('./output/feedback/学情报告-%s%s已完成.docx'%(stu,this_df['live'].values))

    def get_work_done_list(self):
        df=self.df
        df=df[df['work']==df['workSum']]
        self.li_will_do_something=df['姓名'].to_list()

    def get_live_done_list(self):
        df=self.df
        df=df[df['live']==df['liveSum']]
        self.li_will_do_something=df['姓名'].to_list()

    def get_work_is_list(self,n):
        df=self.df
        df=df[df['work']==n]
        self.li_will_do_something=df['姓名'].to_list()

    def get_input_list(self):
        print('从Excel中拷贝名单，完成后输入quit后回车退出')
        self.li_will_do_something.clear()
        while True:
            input_ch = input()
            if (input_ch == 'quit'):    # :q 为停止符
                break
            else:
                self.li_will_do_something.append(input_ch)
        for i in self.li_will_do_something:
            i.replace('\n','')

    def gen_table_in_pptx(self,cols):
        prs = Presentation()
        slide = prs.slides.add_slide(prs.slide_layouts[6])  #用空页布局创建一页幻灯片
        img_path=r'praise.png'
        slide.shapes.add_picture(img_path, Inches(0), Inches(0))

        left, top, width, height = Inches(0.8), Inches(2.8), Inches(8), Inches(3.8)
        li=self.li_will_do_something
        cols=cols
        rows=len(li)//cols+1
        table = slide.shapes.add_table(rows, cols, left, top, width, height).table  
        n=0
        while True:
            try:
                for i in range(rows):
                    for j in range(cols):
                        table.cell(i,j).text=li[n]
                        n+=1
                        table.cell(i,j).text_frame.paragraphs[0].font.name='STHeiti'
                        table.cell(i,j).text_frame.paragraphs[0].font.color.rgb = RGBColor(0,0,0)
                        table.cell(i,j).text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
                break
            except:
                break
        prs.save('praise.pptx')

    def df_to_excel(self):
        """处理后的表格导出到temp文件夹下

        数据档案:

        分列

        单次考试:

        作业批改详情:

        合并
        """        
        self.df.to_excel('./temp/df.xlsx')
        self.db.to_excel('./temp/db.xlsx')
        self.df_single.to_excel('./temp/df_single.xlsx')
class Student(object):
    def __init__(self,name,live,liveSum,work,workSum):
        self.name=name
        self.live=live
        self.liveSum=liveSum
        self.work=work
        self.workSum=workSum